נמאס מהכתובות העלובות האלו, לא? index.php?r=account/register זה די עלוב בשביל הרשמה, לא כך?
המדריך הזה הוא חלק מסדרת המדריכים שכתב אליהו בסה על הפריימוורק Yii של שפת פיתוח האינטרנט PHP.
עד עכשיו כדי להשתמש בפעולות וקונטרולרים השתמשנו במשהו כמו ?r=account/register, וזה די מעצבן, לא?
אז למה שלא פשוט נעשה register.php במקום index.php?r=account/register?
בשביל זה צריך לעשות כמה דברים:
ניצור קובץ htaccess בשביל לאפשר ל-Yii גישה לעבודה עם כתובות "לא אמתיות", כלומר שהקובץ לא קיים, אבל הכתובת קיימת. אפשר לקרוא לזה ניתוב.
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
את זה תכניסו לקובץ ה-htaccess [שזה קובץ שהשם שלו הוא נקודה (.) ולאחריה הטקסט htaccess] בתיקייה הראשית.
עכשיו יש ל-Yii גישה לעבוד עם קישור.
ניכנס ל-config ונוסיף urlManager (שהוא מערך) למפתח בשם components.
protected/config/config.php
<?php
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
),
"urlManager" => array
(
)
),
"import" => array
(
"application.controllers.*",
"application.models.*"
)
);
?>
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
),
"urlManager" => array
(
)
),
"import" => array
(
"application.controllers.*",
"application.models.*"
)
);
?>
בתוך urlManager נגדיר את כל הקישורים ומספר הגדרות נוספות.
בתוך ה-urlManager ניצור אלמנט בשם urlFormat שהערך שלו יהיה path, כדי ש-Yii תדע באיזו כתובת מדובר.
<?php
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
),
"urlManager" => array
(
"urlFormat" => "path"
)
),
"import" => array
(
"application.controllers.*",
"application.models.*"
)
);
?>
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array
(
"connectionString" => "mysql:host=localhost;dbname=lesson",
"username" => "root",
"password" => "",
"charset" => "utf8"
),
"urlManager" => array
(
"urlFormat" => "path"
)
),
"import" => array
(
"application.controllers.*",
"application.models.*"
)
);
?>
עכשיו אנחנו יכולים להגדיר את הכתובות.
אנחנו יכולים להגדיר את הכתובות שיהיו עם כל סיומת שרק נרצה, אפשר גם בלי סיומת.
לדוגמה: register.html ,register.php ואפילו register.asp או register.
את כל הכתובות אנחנו מכניסים ב-rules שבתוך ה-urlManager.
<?php
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array('connectionString'=>'sqlite:protected/data/Lesson.db'),
"urlManager" => array
(
"urlFormat" => "path",
"rules" => array
(
"register.php" => "account/register"
)
)
),
"import" => array
(
"application.controllers.*",
"application.models.*"
)
);
?>
return array
(
"defaultController" => "main",
"components" => array
(
"db" => array('connectionString'=>'sqlite:protected/data/Lesson.db'),
"urlManager" => array
(
"urlFormat" => "path",
"rules" => array
(
"register.php" => "account/register"
)
)
),
"import" => array
(
"application.controllers.*",
"application.models.*"
)
);
?>
אני חושב שזה די מובן, אבל אני אסביר.
בשם של האיבר במערך אנו כותבים את "הקישור המזויף" - הקישור שרק מקשר לדף האמתי, והערך של האיבר הוא השם של הקונטרולר והשם של הפעולה (אפשר לומר שזה הערך של הִֹ-$_GET['r']).
אם נשמור את הקוד שכתבנו מקודם, כאשר ננסה לגשת לכתובת register.php באתר שלנו, אנו נגיע אל דף ההרשמה.
עכשיו אנחנו צריכים למנוע מהגולשים לדעת על "הקבצים האמתיים" שלנו.
אם ניכנס לתיקייה protected דרך הדפדפן, אנחנו נראה את כל התיקיות, הקבצים והקונטרולרים.
הפתרון פשוט מאוד: ניכנס לתיקייה protected, ניצור שם קובץ htaccess ונכניס לתוכו את השורה הבאה:
protected/.htaccess
deny from all
ועכשיו לא יהיה ניתן לפנות אל התיקייה הזאת דרך צד הלקוח. :)
תגובות לכתבה:
תתתתתתתווווווווווווווווווווודדדדדדדדדדדדדדדדדדדדדדהההההההההההההההההההההההה!!!!!!!!!!
לא ידעתי מה לעשות עם הכתובות המסריחות האלה XD
הצלת אותי!
תמשיך להכין מדריכים! זה חשוב D:
thx you helped me so much
כל הכבוד!
אחלה השקעה.!
תודה לך
מחכה למדריך הבא
מה קורה עם עוד מדריכים?
אני בטוח שכשאליהו יוכל - הוא יכתוב. אין טעם להציק בעניין... :)
כשאני מוסיף את ה-htaccess אז אין לי גישה לאתר...
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
..................
למה זה קורה?
הי אנונימי
זה קצת בדילאי, אבל עדיף מאוחר מאשר אף פעם:
אתה צריך לאפשר HTACCESS בשרת שלך, אם זה ב WAMP תחפש בגוגל איך לאפשר את זה ב WAMP - זה אכן אפשרי ופשוט.
מוזר אבל זה לא עובד לי .. .:(
כל הבקשות מובנות לאינדקס בקונרטולר הראשי ...
יענו על כתובת מגיעה לשמה .
מעולה. עכשיו בקובץ הקונפיגורציה תגדיק ל YII מה לעשות עם "כל כתובת" שמגיעה לשם.
זה הקטע ! שאני מגדיר נגיד לדוגמא שאני ניגש לlogin.html אני אגיע לsite\login וזה כיאלו לא קיים , אני מופנה לאינדקס של הקונטרולר הראשי .
פתח שאלה, תצרף את הקוד של htaccess וקונפיגורציה שלך ונראה מה קורה
סבבה :)
תודה רבה!.
אשמח מאוד (אני מאמין שלא רק אני, אלא עוד אנשים כמוני שלומדים YII) אם תמשיך לכתוב מדריכים על YII :-).